package br.edu.unipampa.rpii;

import java.util.Scanner;

/**
 * Narrativa
 *
 * @author Alex Malmann Becker
 * @since 18/11/2012
 * @version 1.0
 *
 * Classe da Narrativa do jogo.
 */
public class Narrativa {

    private Personagem personagem;
    private Charco charco;
    private Deserto deserto;
    private Scanner teclado = new Scanner(System.in);

    /**
     * Método construtor da classe, inicializando classe com os parametros
     * Personagem, Charco e Deserto
     *
     * @param personagem
     * @param charco
     * @param deserto
     */
    public Narrativa(Personagem personagem, Charco charco, Deserto deserto) {
        this.personagem = personagem;
        this.charco = charco;
        this.deserto = deserto;
    }

    /**
     * Método para começar o jogo. Conta história inicial
     */
    public void comecarJogo() {
        this.getPersonagem().setPosicaoAtual(0.0);

        System.out.println("========================================== RPG AVENTURA SOLO ============================================\n"
                + "        Seja Bem Vindo a essa aventura, a qual você foi o escolhido para essa importante missão!");
        imprimeLinha("", "\n");
        System.out.println("Em meio a Revolução Farroupilha, na província de São Pedro do Rio Grande do Sul se declarou independente. \n"
                + "Entre 20 de setembro de 1835 a 1 de março de 1845, neste periodo a cidade de Alegrete se tornou vital na \n"
                + "Guerra dos Farrapos, chegando a abrigar o Presidente da República Rio Grandense General Bento Gonsalves, \n"
                + "chegando Alegrete a se tornar 3ª Capital Farrapa.\n");
        imprimeLinha("", "\n");
    }

    /**
     * Método para escolher caminho. retorna se irá pelo deserto ou pelo charco
     *
     * @return retorna: 1 = Deserto | 2 = Charco
     */
    public int escolherCaminho() {
        System.out.println(this.personagem.getNome()
                + ", você deverá entregar uma mensagem de imensa importância para o Presidente, ficando\n"
                + "sempre atento aos obstáculos no percurso. Nesse momento você se encontra na fronteira Leste do\n"
                + "município, e você possuí duas rotas para seguir, a Estrada do Charco e a Travessia do Deserto,\n"
                + "escolha o caminho desejado e Boa Viagem:\n"
                + "1 = Deserto\n"
                + "2 = Charco");
        boolean continuar = false;
        int caminhoEscolhido;
        do {
            caminhoEscolhido = teclado.nextInt();
            if (caminhoEscolhido == 1 || caminhoEscolhido == 2) {
                continuar = true;
            } else {
                System.out.println("Caminho inválido. Digite novamente.");
                teclado.nextLine();
                continuar = false;
            }

        } while (!continuar);

        return caminhoEscolhido;
    }

    /**
     * Método que mostra a mensagem caso consiga atingir o objetivo
     */
    public void objetivoAlcancado() {
        imprimeLinha("\n", "\n\n");
        System.out.println("Parabéns!!! Você conseguiu vencer todos os obstáculos e entregou a mensagem ao Presidente.\n"
                + "Fique atento a próxima missão e até breve...\n\n");
        imprimeLinha("", "\n");
    }

    /**
     * Método que mostra a mensagem caso não consiga atingir o objetivo
     */
    public void objetivoNaoAlcancado() {
        imprimeLinha("\n", "\n\n");
        System.out.println("Ops!!! Você não alcançou seu objetivo e acabou morrendo.\n\n");
        imprimeLinha("", "\n");
    }

    /**
     * Método para imprimir linha
     *
     * @param msgInicio qtde de espaço no inicio da linha
     * @param msgFim qtde de espaço no final da linha
     */
    public void imprimeLinha(String msgInicio, String msgFim) {
        System.out.println(msgInicio + "=========================================================================================================" + msgFim);
    }

    /**
     * Método que vai escolher a passagem dentro do charco
     *
     * @return retorna qual passagem escolhida (Nenhum | Norte | Sul)
     */
    public String escolherPassagem() {
        imprimeLinha("\n", "\n\n");
        System.out.println("Você escolheu ir pela Estrada do Charco, sendo essa dividida em duas passagens. Para saber qual passagem \n"
                + "deverá seguir você deverá usar sua habilidade em prever o tempo. Deseja usar sua habilidade agora?\n"
                + "S = SIM\n"
                + "N = NÃO");

        boolean continuar = false;
        String usarHabilidade;
        do {
            usarHabilidade = teclado.next();
            if ("S".equalsIgnoreCase(usarHabilidade.toUpperCase()) || "N".equalsIgnoreCase(usarHabilidade.toUpperCase())) {
                continuar = true;
            } else {
                System.out.println("Valor informado incorreto. Digite novamente.");
                teclado.nextLine();
                continuar = false;
            }
        } while (!continuar);

        if ("N".equalsIgnoreCase(usarHabilidade.toUpperCase())) {
            return "Nenhum";
        } else {
            if ("tpSol".equalsIgnoreCase(this.personagem.preverTempo())) {
                imprimeLinha("\n", "\n\n");
                System.out.println("Sua previsão mostra que será Ensolarado, você seguirá pela Passagem Norte\n\n");
                imprimeLinha("", "\n");
                return "Norte";
            } else {
                imprimeLinha("\n", "\n\n");
                System.out.println("Sua previsão mostra que será Chuvoso, você seguirá pela Passagem Sul\n\n");
                imprimeLinha("", "\n");
                return "Sul";
            }
        }
    }

    /**
     * Método que le o teclado
     *
     * @return
     */
    public Scanner getTeclado() {
        return this.teclado;
    }

    /**
     * Método que le o charco
     *
     * @return
     */
    public Charco getCharco() {
        return charco;
    }

    /**
     * Método que seta o charco
     *
     * @param charco
     */
    public void setCharco(Charco charco) {
        this.charco = charco;
    }

    /**
     * Método que le o deserto
     *
     * @return the deserto
     */
    public Deserto getDeserto() {
        return deserto;
    }

    /**
     * método que seta o deserto
     *
     * @param deserto
     */
    public void setDeserto(Deserto deserto) {
        this.deserto = deserto;
    }

    /**
     * método que le o personagem
     *
     * @return
     */
    public Personagem getPersonagem() {
        return personagem;
    }

    /**
     * método que seta o personagem
     *
     * @param personagem the personagem to set
     */
    public void setPersonagem(Personagem personagem) {
        this.personagem = personagem;
    }
}
